home *** CD-ROM | disk | FTP | other *** search
/ Aminet 12 / Aminet 12 (1996)(GTI - Schatztruhe)[!][Jun 1996].iso / Aminet / dev / e / eiffel.lha / flc / source / ame_code.e next >
Encoding:
Text File  |  1996-01-27  |  6.7 KB  |  247 lines

  1.  
  2. -> Copyright © 1995, Guichard Damien.
  3.  
  4. -> Note the use of inheritance hierarchy:
  5. -> Is MC680x0 a specialization of the AME machine or the other way around?
  6. -> As both are universal the question is irrelevant.
  7. -> Don't matter wether the machines are virtual or real.
  8.  
  9. OPT MODULE
  10.  
  11. MODULE '*ame','*code'
  12.  
  13. EXPORT CONST IRTD = $4E74
  14.  
  15. DEF l_opcode,l_mode,l_source,l_dest
  16. DEF current
  17.  
  18. EXPORT OBJECT ame_code OF code
  19. ENDOBJECT
  20.  
  21. -> Generation of all AME instructions.
  22. PROC ame(opcode,mode,source,dest) OF ame_code
  23.   IF l_opcode=I_CALL
  24.     l_opcode:=0
  25.     IF mode=M_REGISTER
  26.       self.generate(opcode,l_mode,l_source,dest)
  27.       RETURN
  28.     ELSE
  29.       self.generate(I_CALL,l_mode,l_source,l_dest)
  30.     ENDIF
  31.   ENDIF
  32.   IF opcode=I_CALL
  33.     IF dest<>R_NONE
  34.       l_opcode:=opcode
  35.       l_mode:=mode
  36.       l_source:=source
  37.       l_dest:=dest
  38.       RETURN
  39.     ENDIF
  40.   ENDIF
  41.   self.generate(opcode,mode,source,dest)
  42. ENDPROC
  43.  
  44. -> Generate AME code.
  45. PROC generate(opcode,mode,source,dest) OF ame_code
  46.   DEF idata,imode,ireg:PTR TO INT
  47.   -> dump(opcode,mode,source,dest)
  48.   SELECT M_NONE OF mode
  49.   CASE M_TRUE
  50.     idata:=TRUE
  51.     imode:=MODE7
  52.     ireg:=IMM
  53.   CASE M_FALSE
  54.     idata:=FALSE
  55.     imode:=MODE7
  56.     ireg:=IMM
  57.   CASE M_VOID
  58.     idata:=NIL
  59.     imode:=MODE7
  60.     ireg:=IMM
  61.   CASE M_CURRENT
  62.     idata:=0
  63.     imode:=ARDIR
  64.     ireg:=0
  65.   CASE M_IMMEDIATE
  66.     idata:=source
  67.     imode:=MODE7
  68.     ireg:=IMM
  69.   CASE M_STRING
  70.     idata:=source
  71.   CASE M_REGISTER
  72.     idata:=0
  73.     imode:=DREG
  74.     ireg:=source
  75.   CASE M_ATTRIBUT
  76.     idata:=source*4
  77.     imode:=ARDISP
  78.     ireg:=current
  79.   CASE M_ARG
  80.     idata:=source*4+12
  81.     imode:=ARDISP
  82.     ireg:=5
  83.   CASE M_LOCAL
  84.     idata:=-source*4-4
  85.     imode:=ARDISP
  86.     ireg:=5
  87.   CASE M_ROUTINE
  88.     idata:=source-1*4
  89.     imode:=ARDISP
  90.   CASE M_LABEL
  91.     idata:=source
  92.   ENDSELECT
  93.   SELECT I_NONE OF opcode
  94.   CASE I_ADD
  95.     self.putF5(IADD,L,idata,imode,ireg,dest)
  96.   CASE I_AND
  97.     self.putF5(IAND,L,idata,imode,ireg,dest)
  98.   CASE I_ASSIGN
  99.     self.putF4(L,0,DREG,dest,idata,imode,ireg)
  100.   CASE I_CALL
  101.     IF mode=M_ROUTINE
  102.       self.putF4(L,0,ARIND,1,0,ARDIR,2)            ->  move.l  (a1),a2
  103.       self.putF3(IJSR,idata,imode,2)               ->  jsr     d8(a2)
  104.     ELSEIF mode=M_STRING
  105.       self.putF4(L,0,DREG,0,0,ARDIR,2)             ->  move.l  d0,a2
  106.       self.putF7(IADDQ,L,4,0,ARDIR,2)              ->  addq.l  #4,a2
  107.       self.putF2(ILEA,StrLen(idata),MODE7,ABSW,6)  ->  lea     StrLen.w,a6
  108.       self.putF4(L,0,ARDIR,6,0,ARPOST,2)           ->  move.l  a6,(a2)+
  109.       self.putF4(L,0,ARDIR,6,0,ARPOST,2)           ->  move.l  a6,(a2)+
  110.       self.putF2(ILEA,6,MODE7,PCDISP,6)            ->  lea     text(pc),a6
  111.       self.putF4(L,0,ARDIR,6,0,ARPOST,2)           ->  move.l  a6,(a2)+
  112.       self.putword(StrLen(idata)+1 AND $FE OR IBRA)
  113.       self.putbinary(idata,StrLen(idata)+1 AND $FE+idata)
  114.     ELSE
  115.       self.putF4(L,idata,imode,ireg,0,DREG,dest)
  116.     ENDIF
  117.   CASE I_CLASSFIELDS
  118.     self.putlong(idata)
  119.   CASE I_CREATE
  120.     self.global_ref(idata)
  121.     self.putF2(ILEA,0,MODE7,PCDISP,2)         ->  lea     class(pc),a2
  122.     self.putF4(L,$20,ARDISP,4,0,ARDIR,6)      ->  move.l  $20(a4),a6
  123.     self.putF3(IJSR,0,ARIND,6)                ->  jsr     (a6)
  124.   CASE I_CURRENT
  125.     IF mode=M_NONE
  126.       current:=0
  127.     ELSE
  128.       self.putF4(L,idata,imode,ireg,0,ARDIR,1)
  129.       current:=1
  130.     ENDIF
  131.   CASE I_DIV
  132.     self.putF2(IDIVS,idata,imode,ireg,dest)
  133.   CASE I_ENDROUTINE
  134.     self.putword(IUNLK OR 5)
  135.     self.putF4(L,0,ARPOST,7,0,ARDIR,0)
  136.     self.putword(IF idata THEN IRTS ELSE IRTD)
  137.     IF idata THEN self.putword(idata*SIZEOF LONG)
  138.     self.resolve_locals()
  139.   CASE I_EQUAL
  140.     self.putF5(ICMP,L,idata,imode,ireg,dest)
  141.     self.putF3(ISEQ,0,DREG,dest)
  142.   CASE I_GREATERTHAN
  143.     self.putF5(ICMP,L,idata,imode,ireg,dest)
  144.     self.putF3(ISGT,0,DREG,dest)
  145.   CASE I_JALWAYS
  146.     self.local_ref(idata)
  147.     self.putword(IBRA)
  148.     self.putword(0)
  149.   CASE I_JFALSE
  150.     self.local_ref(idata)
  151.     self.putword(IBEQ)
  152.     self.putword(0)
  153.   CASE I_JTRUE
  154.     self.local_ref(idata)
  155.     self.putword(IBNE)
  156.     self.putword(0)
  157.   CASE I_LABEL
  158.     self.define_local(idata)
  159.   CASE I_LESSTHAN
  160.     self.putF5(ICMP,L,idata,imode,ireg,dest)
  161.     self.putF3(ISLT,0,DREG,dest)
  162.   CASE I_LINK
  163.     self.global_ref(idata)
  164.     self.putword(IBRA)
  165.     self.putword(0)
  166.   CASE I_LOCALS
  167.     self.putword(IMOVEQ)
  168.     FOR ireg:=1 TO idata
  169.       self.putF4(L,0,DREG,0,0,ARPRE,SP)
  170.     ENDFOR
  171.   CASE I_MOD
  172.     self.putF2(IDIVS,idata,imode,ireg,dest)
  173.     self.putword(ISWAP OR dest)
  174.     self.putword(IEXTL OR dest)
  175.   CASE I_MUL
  176.     self.putF2(IMULS,idata,imode,ireg,dest)
  177.   CASE I_NEG
  178.     self.putF1(INEG,L,0,DREG,dest)
  179.   CASE I_NOT
  180.     self.putF1(INOT,L,0,DREG,dest)
  181.   CASE I_NOTEQUAL
  182.     self.putF5(ICMP,L,idata,imode,ireg,dest)
  183.     self.putF3(ISNE,0,DREG,dest)
  184.   CASE I_NOTGREATER
  185.     self.putF5(ICMP,L,idata,imode,ireg,dest)
  186.     self.putF3(ISLE,0,DREG,dest)
  187.   CASE I_NOTLESS
  188.     self.putF5(ICMP,L,idata,imode,ireg,dest)
  189.     self.putF3(ISGE,0,DREG,dest)
  190.   CASE I_OR
  191.     self.putF5(IOR,L,idata,imode,ireg,dest)
  192.   CASE I_POPREGS
  193.     IF idata=1
  194.       self.putF4(L,0,ARPOST,7,0,DREG,1)
  195.     ELSE
  196.       self.putword($4CDF)
  197.       ireg:=[$0002,$0006,$000E,$001E,$003E,$007E,$00FE]:INT
  198.       self.putword(ireg[idata-1])
  199.     ENDIF
  200.   CASE I_PUSH
  201.     self.putF4(L,idata,imode,ireg,0,ARPRE,SP)
  202.   CASE I_PUSHREGS
  203.     IF idata=1
  204.       self.putF4(L,0,DREG,1,0,ARPRE,7)
  205.     ELSE
  206.       self.putword($48E7)
  207.       ireg:=[$4000,$6000,$7000,$7800,$7C00,$7E00,$7F00]:INT
  208.       self.putword(ireg[idata-1])
  209.     ENDIF
  210.   CASE I_ROUTINE
  211.     self.define_global(idata)
  212.     self.putF4(L,0,ARDIR,0,0,ARPRE,7)
  213.     self.putF4(L,0,ARDIR,1,0,ARDIR,0)
  214.     self.putword(ILINK OR 5)
  215.     self.putword(0)
  216.   CASE I_SUB
  217.     self.putF5(ISUB,L,idata,imode,ireg,dest)
  218.   CASE I_TABLE
  219.     self.define_global(idata)
  220.   CASE I_XOR
  221.     self.putF4(L,idata,imode,ireg,0,DREG,0)
  222.     self.putF5(IEOR,L,0,DREG,dest,0)
  223.   ENDSELECT
  224. ENDPROC
  225.  
  226. -> Dump AME code.
  227. PROC dump(opcode,mode,source,dest)
  228.   DEF mnemo:PTR TO LONG,modes:PTR TO LONG
  229.   mnemo:=['ADD\t\t','AND\t\t','ASSIGN\t\t','CALL\t\t','CLASSFIELDS\t',
  230.           'CREATE\t\t','CURRENT\t\t','DIV\t\t','ENDROUTINE\t','EQUAL\t\t',
  231.           'GREATERTHAN\t','JALWAYS\t\t.','JFALSE\t\t.','JTRUE\t\t.',
  232.           'LABEL\t\t.','LESSTHAN\t','LINK\t\t','LOCALS\t\t','MOD\t\t',
  233.           'MUL\t\t','NEG\t\t','NOT\t\t','NOTEQUAL\t','NOTGREATER\t',
  234.           'NOTLESS\t\t','OR\t\t','POPREGS\t\t','PUSH\t\t','PUSHREGS\t',
  235.           'ROUTINE\t\t','SUB\t\t','TABLE\t\t','XOR\t\t']
  236.   modes:=['true','false','Void','','Current','',
  237.           'R','Attribut ','Arg ','Local ','Routine ','L','']
  238.   VfPrintf(stdout,'\s\s',[mnemo[opcode],modes[mode]])
  239.   IF mode=M_STRING THEN VfPrintf(stdout,'"\s"',[source])
  240.   IF mode>M_CURRENT THEN VfPrintf(stdout,'\d',[source])
  241.   IF dest<>R_NONE THEN
  242.     VfPrintf(stdout,'\sR\d',
  243.       [IF mode=M_NONE THEN '' ELSE ', ', dest])
  244.   FputC(stdout,10)
  245. ENDPROC
  246.  
  247.